/**
 * OKX 交易所 API 封装
 */
import { get, post, del } from './request.js'
import { API_ENDPOINTS } from './config.js'

/**
 * 获取所有产品行情信息
 * @param {string} instType - 产品类型 (SPOT, SWAP, FUTURES)
 * @returns {Promise}
 */
export function getTickers(instType = 'SPOT') {
  return get(API_ENDPOINTS.OKX.TICKERS, { inst_type: instType })
}

/**
 * 获取单个产品行情信息
 * @param {string} instId - 产品ID，如 BTC-USDT
 * @returns {Promise}
 */
export function getTicker(instId) {
  return get(API_ENDPOINTS.OKX.TICKER(instId))
}

/**
 * 获取产品深度（订单簿）
 * @param {string} instId - 产品ID
 * @param {string} sz - 深度档位数量，默认20，最大400
 * @returns {Promise}
 */
export function getOrderbook(instId, sz = '20') {
  return get(API_ENDPOINTS.OKX.ORDERBOOK(instId), { sz })
}

/**
 * 获取K线数据
 * @param {string} instId - 产品ID
 * @param {string} bar - K线周期 (1m, 5m, 15m, 1H, 4H, 1D等)
 * @param {string} limit - 返回数据条数，默认100，最大300
 * @returns {Promise}
 */
export function getCandles(instId, bar = '1m', limit = '100') {
  return get(API_ENDPOINTS.OKX.CANDLES(instId), { bar, limit })
}

/**
 * 获取交易产品基础信息
 * @param {string} instType - 产品类型
 * @returns {Promise}
 */
export function getInstruments(instType = 'SPOT') {
  return get(API_ENDPOINTS.OKX.INSTRUMENTS, { inst_type: instType })
}

/**
 * 获取法币汇率
 * @returns {Promise}
 */
export function getExchangeRate() {
  return get(API_ENDPOINTS.OKX.EXCHANGE_RATE)
}

/**
 * 获取币种交易对列表（用于下拉选择）
 * @param {string} instType - 产品类型 (SPOT, SWAP, FUTURES)
 * @returns {Promise}
 */
export function getSymbols(instType = 'SPOT') {
  return get('/api/okx/symbols', { inst_type: instType })
}

/**
 * 获取账户余额
 * @param {string} ccy - 币种，如 BTC（可选）
 * @returns {Promise}
 */
export function getBalance(ccy = null) {
  const params = ccy ? { ccy } : null
  return get(API_ENDPOINTS.OKX.BALANCE, params)
}

/**
 * 获取持仓信息
 * @param {string} instType - 产品类型（可选）
 * @returns {Promise}
 */
export function getPositions(instType = null) {
  const params = instType ? { inst_type: instType } : null
  return get(API_ENDPOINTS.OKX.POSITIONS, params)
}

/**
 * 下单
 * @param {object} orderData - 订单数据
 * @returns {Promise}
 */
export function placeOrder(orderData) {
  return post(API_ENDPOINTS.OKX.ORDER, orderData)
}

/**
 * 撤单
 * @param {string} instId - 产品ID
 * @param {string} ordId - 订单ID
 * @returns {Promise}
 */
export function cancelOrder(instId, ordId) {
  return del(API_ENDPOINTS.OKX.CANCEL_ORDER(instId, ordId))
}

/**
 * 获取订单信息
 * @param {string} instId - 产品ID
 * @param {string} ordId - 订单ID
 * @returns {Promise}
 */
export function getOrder(instId, ordId) {
  return get(API_ENDPOINTS.OKX.GET_ORDER(instId, ordId))
}

/**
 * 批量获取多个交易对的行情
 * @param {Array<string>} instIds - 产品ID数组
 * @returns {Promise<Array>}
 */
export async function getBatchTickers(instIds) {
  try {
    const promises = instIds.map(instId => getTicker(instId))
    const results = await Promise.all(promises)
    return results
  } catch (error) {
    console.error('批量获取行情失败:', error)
    throw error
  }
}

/**
 * 格式化行情数据
 * @param {object} tickerData - OKX 返回的行情数据
 * @returns {object} - 格式化后的数据
 */
export function formatTickerData(tickerData) {
  if (!tickerData || tickerData.code !== '0' || !tickerData.data || tickerData.data.length === 0) {
    return null
  }

  const ticker = tickerData.data[0]
  
  // 计算涨跌幅：(当前价 - 24h开盘价) / 24h开盘价
  const lastPrice = parseFloat(ticker.last) || 0
  const open24h = parseFloat(ticker.open24h) || lastPrice
  const changePercent = open24h !== 0 ? (lastPrice - open24h) / open24h : 0

  return {
    instId: ticker.instId,
    pair: ticker.instId.replace('-', '/'),
    price: lastPrice,
    priceFormatted: formatPrice(ticker.last),
    change: changePercent,
    changeFormatted: `${changePercent > 0 ? '+' : ''}${(changePercent * 100).toFixed(2)}%`,
    isPositive: changePercent > 0,
    high24h: parseFloat(ticker.high24h),
    low24h: parseFloat(ticker.low24h),
    vol24h: parseFloat(ticker.vol24h),
    volCcy24h: parseFloat(ticker.volCcy24h),
    open24h: open24h,
    timestamp: ticker.ts
  }
}

/**
 * 格式化价格显示
 * @param {string|number} price - 价格
 * @returns {string}
 */
function formatPrice(price) {
  const num = parseFloat(price)
  if (isNaN(num)) return '0.00'
  
  if (num >= 1000) {
    return num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
  }
  return num.toFixed(2)
}
